package com.yyc.bleem.common.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.apache.commons.lang3.time.DateUtils;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * jwtToken工具类
 * @author yyc
 */
public class JwtTokenUtil {

    /**自定义秘钥*/
    private static final String SECRET = "#%@yyc0104^%#";
    /**发行者*/
    private static final String ISSUER = "yyc";

    /**
     * 根据用户id生成token
     * @param userId 用户id
     * @return String
     */
    public static String createToken(Long userId){
        try{
            Map<String,Object> map=new HashMap<>(16);
            map.put("alg","HS256");
            map.put("typ","JWT");
            String token=JWT.create()
                    .withIssuer(ISSUER)
                    //1、jwt中的header部分,可以不进行指定默认为map中的内容
                    .withHeader(map)
                    //2、payload部分
                    .withClaim("userId",userId)
                    //设置令牌过期时间为4小时
                    .withExpiresAt(DateUtils.addHours(new Date(),12))
                    //3、签名
                    .sign(Algorithm.HMAC256(SECRET));
            return token;
        }catch (Exception e){
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * 获取token中的用户id
     * @param token token信息
     * @return Map
     */
    public static Long getInfoByToken(String token){
        //创建验证对象
        JWTVerifier jwtVerifier =JWT.require(Algorithm.HMAC256(SECRET)).build();
        DecodedJWT deprecated=jwtVerifier.verify(token);
        return deprecated.getClaim("userId").asLong();
    }

    /**
     * 根据前端header中的获取的token，判断token是否过期
     * @return boolean
     */
    public static Boolean isExpiredByToken(String token){
        try{
            //创建验证对象
            JWTVerifier jwtVerifier =JWT.require(Algorithm.HMAC256(SECRET)).build();
            DecodedJWT deprecated=jwtVerifier.verify(token);
            //获取token中的过期时间
            Date expiresAt = deprecated.getExpiresAt();
            //系统当前时间
            Date date=new Date();
            //token中的时间与系统当前时间比较，查看是否过期
            //token中的时间在系统时间之后则未过期，否则过期
            if(expiresAt.after(date)){
                System.out.println("token未过期,过期时间："+expiresAt);
                return true;
            }else{
                //此处异常被直接捕获
                System.out.println("token已过期！");
                return false;
            }
        }catch (TokenExpiredException e){
            return false;
        }
    }

    /**
     * token认证
     * 验证token中是否包含该有的数据
     * @param token token信息
     * @return Boolean
     */
    public static Boolean verifyToken(String token){
        DecodedJWT deprecated=JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
        Long userId = deprecated.getClaim("userId").asLong();
        if(userId != null){
            return true;
        }else{
            return false;
        }
    }




}
